package com.tom.joke.permission;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;

import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * Added by Tom on 2024/07/16.
 * 类里面的方法，都是静态方法。
 * 处理权限请求的工具类。
 */
public class PermissionUtils {
    private PermissionUtils() {
        throw new UnsupportedOperationException("不能被实例化");
    }

    // 判断是否是6.0 以上的版本。
    public static boolean isOverMarshmallow() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
    }

    // 执行成功方法。
    public static void executeSuccessMethod(Object reflectObject, int requestCode) {
        // 获取class中所有的方法，遍历是否有 标记，并且要请求码一致。
        Method[] methods = reflectObject.getClass().getDeclaredMethods();
        for (Method method : methods) {
            // 该方法上有没有打这个标记
            PermissionSuccess successMethod = method.getAnnotation(PermissionSuccess.class);
            if (successMethod != null) {
                int methodCode = successMethod.requestCode();
                if (methodCode == requestCode) {
                    // 找到了目标方法，去反射执行该方法。
                    executeMethod(reflectObject, method);
                }
            }
        }
    }

    // 反射执行方法。
    private static void executeMethod(Object reflectObject, Method method) {
        // 执行方法，第一个是该方法属于哪个类， 第二个是参数。
        try {
            method.setAccessible(true); // 临时允许调用私有方法
            method.invoke(reflectObject, new Object[]{});
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取未授予的权限（返回没有授予过的权限）
     *
     * @param object Activity或Fragment
     * @return 没有授予过的权限
     */
    public static List<String> getDeniedPermission(Object object, String[] requestPermissions) {
        List<String> deniedPermissions = new ArrayList<>();
        for (String requestPermission : requestPermissions) {
            if (ContextCompat.checkSelfPermission(getActivity(object), requestPermission) ==
                    PackageManager.PERMISSION_DENIED) {
                deniedPermissions.add(requestPermission);
            }
        }
        return deniedPermissions;
    }

    public static Activity getActivity(Object object) {
        if (object instanceof Activity) {
            return (Activity) object;
        } else if (object instanceof Fragment) {
            return ((Fragment) object).getActivity();
        }
        return null;
    }

    /**
     * 用户授权失败，执行的方法
     * @param reflectObject  Activity或Fragment
     * @param requestCode
     */
    public static void executeFailMethod(Object reflectObject, int requestCode) {
        // 获取class中所有的方法，遍历是否有 标记，并且要请求码一致。
        Method[] methods = reflectObject.getClass().getDeclaredMethods();
        for (Method method : methods) {
            // 该方法上有没有打这个标记 PermissionFail
            PermissionFail failMethod = method.getAnnotation(PermissionFail.class);
            if (failMethod != null) {
                int methodCode = failMethod.requestCode();
                if (methodCode == requestCode) {
                    // 找到了目标方法，去反射执行该方法。
                    executeMethod(reflectObject, method);
                }
            }
        }
    }
}
